// 属性是应用于某些模块、crate 或项的元数据（metadata）。这元数据可以用来：

// 条件编译代码
// 设置 crate 名称、版本和类型（二进制文件或库）
// 禁用 lint（警告）
// 启用编译器的特性（宏、全局导入（glob import）等）
// 链接到一个非 Rust 语言的库
// 标记函数作为单元测试
// 标记函数作为基准测试的某个部分

fn used_function() {}

// `#[allow(dead_code)]` 属性可以禁用 `dead_code` lint
#[allow(dead_code)]
fn unused_function() {}

fn noisy_unused_function() {}
// 改正 ^ 增加一个属性来消除警告


fn main() {
    // println!("Hello, world!");
    used_function();
    are_you_on_linux();

    println!("Are you sure?");
    if cfg!(target_os = "linux") {
        println!("Yes. It's definitely linux!");
    } else {
        println!("Yes. It's definitely *not* linux!");
    }

    // conditional_function();
    // rustc custom.rs && ./custom error
    // rustc --cfg some_condition custom.rs && ./custom right




}

// crate_type 属性可以告知编译器 crate 是一个二进制的可执行文件还是一个库（甚至是哪种类型的库），crate_name 属性可以设定 crate 的名称。

// 不过，一定要注意在使用 cargo 时，这两种类型时都没有作用。由于大多数 Rust 工程都使用 cargo，这意味着 crate_type 和 crate_name 的作用事实上很有限。

// 条件编译可能通过两种不同的操作符实现：

// cfg 属性：在属性位置中使用 #[cfg(...)]
// cfg! 宏：在布尔表达式中使用 cfg!(...)

// 这个函数仅当目标系统是 Linux 的时候才会编译
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
    println!("You are running linux!")
}

// 而这个函数仅当目标系统 **不是** Linux 时才会编译
#[cfg(not(target_os = "linux"))]
fn are_you_on_linux() {
    println!("You are *not* running linux!")
}

// 有部分条件如 target_os 是由 rustc 隐式地提供的，但是自定义条件必须使用 --cfg 标记来传给 rustc。

#[cfg(some_condition)]
fn conditional_function() {
    println!("condition met!")
}



